package com.lihepeng.leecode.integer;

import org.junit.Test;

/**
 * 编写一个函数，输入是一个无符号整数（以二进制串的形式），返回其二进制表达式中数字位数为 '1' 的个数（也被称为汉明重量）。
 */
public class Solution191 {
    /**
     * 我们可以直接循环检查给定整数 nn 的二进制位的每一位是否为 11。
     *
     * 具体代码中，当检查第 ii 位时，我们可以让 nn 与 2^i2
     * i
     *   进行与运算，当且仅当 nn 的第 ii 位为 11 时，运算结果不为 00。
     * @param n
     * @return
     */
    public int hammingWeight(int n) {
        int count =0;
        for(int i=0;i<32;i++){
            if ((n&(1<<i))!=0){
                count++;
            }
        }
        return count;
    }

    /**
     * 优化二进制 运算
     * n&(n-1)
     * @param n
     * @return
     */
    public int hammingWeight01(int n) {
        int count =0;
        while (n!=0){
            n=n&(n-1);
            count++;
        }
        return count;
    }
    @Test
    public void runTest(){
        int i = hammingWeight(1);
        System.out.println(i);
    }

}
